#!/usr/bin/python3
import sys,os,requests,json
savepath = os.path.join(os.getcwd(),'dl-model')

def dl(download_url,download_path):
    if not os.path.exists(os.path.split(download_path)[0]):
        os.mkdir(os.path.split(download_path)[0])
    with requests.get(url=download_url, verify=False, stream=True) as res:
        with open(download_path, 'wb') as fd:
            print(f'[INFO] GET {download_url}')
            for chunk in res.iter_content(chunk_size=1024):
                if chunk:
                    fd.write(chunk)
    print(f'[INFO] {download_path} 下载完成')

if __name__ == "__main__":
    if len(sys.argv) > 1:
        print(f'[INFO] 存储位置：{savepath}')
        if not os.path.exists(savepath):
            print('[WARM] 存储位置不存在，创建')
            os.mkdir(savepath)
        
        print(f'[INFO] 原始json地址：{sys.argv[1]}')
        modeljsonname = os.path.split(sys.argv[1])[-1]
        modelname = modeljsonname.split('.')[0]
        print(f'[INFO] 模型名字：{modelname}')

        modelpath = os.path.join(savepath,modelname)
        print(f'[INFO] 模型位置：{modelpath}')
        if not os.path.exists(modelpath):
            print('[WARM] 模型位置不存在，创建')
            os.mkdir(modelpath)
        
        print(f'[INFO] model3.json：{modeljsonname}')
        if not os.path.exists(os.path.join(modelpath,modeljsonname)):
            print('[INFO] 正在下载model3.json')
            dl(sys.argv[1],os.path.join(modelpath,modeljsonname))
        else:
            print('[WARM] 存在未下完的模型，继续下载')

        print('[INFO] 解析model3.json')
        try:
            with open(os.path.join(modelpath,modeljsonname),'r') as f:
                modeljsondict = json.load(f)
        except:
            print(f'[ERROR] {os.path.join(modelpath,modeljsonname)} 解析失败，退出')
        else:
            Moc = modeljsondict['FileReferences']['Moc']
            print(f'[INFO] Moc：{Moc}')
            if not os.path.exists(os.path.join(modelpath,Moc)):
                print('[INFO] 正在下载Moc')
                dl(os.path.join(os.path.split(sys.argv[1])[0],Moc),os.path.join(modelpath,Moc))
            else:
                print(f'[INFO] Moc {Moc} 已下载')
            
            Textures = modeljsondict['FileReferences']['Textures']
            Texturef = os.path.split(Textures[0])[0]
            print(f'[INFO] 纹理：{Texturef}')
            if not os.path.exists(os.path.join(modelpath,Texturef)):
                print('[WARM] 纹理位置不存在，创建')
                os.mkdir(os.path.join(modelpath,Texturef))
            print('[INFO] 正在下载纹理')
            for Texture in Textures:
                print(f'[INFO] 当前纹理：{Texture}')
                if not os.path.exists(os.path.join(modelpath,Texture)):
                    print('[INFO] 正在下载')
                    dl(os.path.join(os.path.split(sys.argv[1])[0],Texture),os.path.join(modelpath,Texture))
                else:
                    print(f'[INFO] 纹理 {Texture} 已下载')

            Physics = modeljsondict['FileReferences']['Physics']
            print(f'[INFO] Physics：{Physics}')
            if not os.path.exists(os.path.join(modelpath,Physics)):
                print('[INFO] 正在下载Physics')
                dl(os.path.join(os.path.split(sys.argv[1])[0],Physics),os.path.join(modelpath,Physics))
            else:
                print(f'[INFO] Physics {Physics} 已下载')

            Motions = modeljsondict['FileReferences']['Motions']['Act']
            print('[INFO] 正在下载Motions')
            for Motion in Motions:
                print(f'[INFO] 当前Motion：{Motion["File"]}')
                if not os.path.exists(os.path.join(modelpath,Motion["File"])):
                    print('[INFO] 正在下载')
                    dl(os.path.join(os.path.split(sys.argv[1])[0],Motion["File"]),os.path.join(modelpath,Motion["File"]))
                else:
                    print(f'[INFO] Motion {Motion["File"]} 已下载')

                print(f'[INFO] 下载Motion对应语音：{Motion["Sound"]}')
                if not os.path.exists(os.path.join(modelpath,Motion["Sound"])):
                    print('[INFO] 正在下载')
                    dl(os.path.join(os.path.split(sys.argv[1])[0],Motion["Sound"]),os.path.join(modelpath,Motion["Sound"]))
                else:
                    print(f'[INFO] Motion {Motion["File"]} 对应语音 {Motion["Sound"]} 已下载')

            Idles = modeljsondict['FileReferences']['Motions']['Idle']
            print('[INFO] 正在下载Idle')
            for Idle in Idles:
                print(f'[INFO] 当前Idle：{Idle["File"]}')
                if not os.path.exists(os.path.join(modelpath,Idle["File"])):
                    print('[INFO] 正在下载')
                    dl(os.path.join(os.path.split(sys.argv[1])[0],Idle["File"]),os.path.join(modelpath,Idle["File"]))
                else:
                    print(f'[INFO] Idle {Idle["File"]} 已下载')
            print(f'[INFO] 模型 {modelname} 下载完成')
    else:
        print(f'[ERROR] 用法: {sys.argv[0]} <xxx.modeljson.json地址>')